#include "common.h"
#define LOG_TAG          "COMMON_MODUEL"
#include "elog.h"

/**
 * @desc  : 发送请求信号 + 阻塞等待应答（请求-应答同步核心接口）
 * @date  : 2025-11-04
 * @author: AnRui
 * @param : data - 通信结构体指针（已通过 comn_data_init 初始化，非NULL）
 * @param : timeout - 等待应答的超时时间（单位：FreeRTOS 系统节拍，portMAX_DELAY=无限等待）
 * @return: comn_err_e - 错误码（comn_option_success 表示成功）
 * @note  : 1. 调用前需先向 data->p_share_memory 写入待传递的数据；
 *          2. 接收方任务需在获取 req_sema 后处理数据，并调用 xSemaphoreGive(ack_sema) 应答
 */
bool comn_send_req_and_wait_ack(SemaphoreHandle_t req_sema,
    SemaphoreHandle_t ack_sema,
    TickType_t timeout,
    char* task_name
)
{
    // 1. 检查通信资源是否有效（避免使用未初始化的结构体）
    if (req_sema == NULL || ack_sema == NULL) {
        log_e("%s input parameter is wrong", task_name);
        return false;
    }

    // 2. 释放请求信号量（通知接收方任务：有数据待处理）
    if (xSemaphoreGive(req_sema) != pdTRUE) {
        log_e("%s give req sema fail", task_name);
        return false;
    }

    // 3. 阻塞等待应答信号量（等待接收方处理完成）
    if (xSemaphoreTake(ack_sema, timeout) != pdTRUE) {
        log_e("%s take ack sema timeout", task_name);
        return false;
    }
    return true;
}
